package com.young.pattern.abstractFactoryPattern;

/**
 * 抽象工厂客户端操作类
 * 皮肤工厂测试嘞
 */
public class Client {


    /**
     * 抽象工厂:
     *  抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
     * 结构：
     *  抽象工厂：声明了一组用于创建一组产品的方法，每个方法对应一个产品
     *  具体工厂：实现了抽象工厂中声明的创建方法
     *  抽象产品：为每种产品声明接口，在抽象产品中声明了产品所具有的业务方法
     *  具体产品：定义了具体工厂生产的具体产品对象，实现抽象产品接口中声明的业务方法
     * 优缺点：
     *  优点:
     *  1,抽象工厂模式隔离了具体类的生成,使得客户端并不需要知道什么被创建.由于这种隔离,更换了一个具体工厂就变得相对容易,所有的具体工厂
     *      都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例就可以在某种程度上改变整个软件系统的行为
     *  2,当一个产品族中的多个对象被设计成一起工作时,他能够保证客户端始终只适用一种指定的抽象工厂来进行数据维护;
     *  3,增加新的产品族很方便,无需修改已有系统,符合开闭原则.
     * 缺点:
     *  1,增减新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至修改抽象层代码,这显然会带来较大的不变,违背了开闭原则.
     *
     */
    public static void main(String[] args) {
        SkinFactory skinFactory = new SummerSkinFactory();
        Button button = skinFactory.createButton();
        ComboBox comboBox = skinFactory.createComboBox();
        TextField textField = skinFactory.createTextField();
        button.display();
        comboBox.display();
        textField.display();
    }
}
